/**
 * 完整游戏流程深度测试
 * 测试：游戏开始 → 案件生成 → 嫌疑人对话 → 推理提交 → 结果评估
 */

import { MastraClient } from '@mastra/client-js';

console.log('🎮 开始完整游戏流程深度测试...\n');

const client = new MastraClient({
  baseUrl: 'http://localhost:4111',
  retries: 3,
  backoffMs: 300,
  maxBackoffMs: 5000,
});

// 游戏状态管理
let gameSession = {
  sessionId: `test-session-${Date.now()}`,
  gameData: null,
  suspects: [],
  clues: [],
  conversations: []
};

async function step1_StartGame() {
  console.log('📋 步骤1: 开始新游戏...');
  
  try {
    const startTime = Date.now();
    
    const result = await client.agent.run({
      agentId: 'gameMasterAgent',
      messages: [
        {
          role: 'user',
          content: `请开始一个新的赛博侦探游戏。

游戏配置：
- 难度：normal
- 主题：办公室谋杀案
- 嫌疑人数量：3
- 玩家档案：{"name": "测试侦探", "experience": "中级"}
- 会话ID：${gameSession.sessionId}

请使用 game-master 工具执行 start_game 操作，生成完整的案件信息、嫌疑人资料和初始线索。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 游戏开始成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用: ${result.toolCalls?.length || 0} 次`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      if (toolResult && toolResult.success) {
        gameSession.gameData = toolResult.data;
        gameSession.suspects = toolResult.data?.suspects || [];
        gameSession.clues = toolResult.data?.discoveredClues || [];
        
        console.log(`   🎯 案件标题: ${toolResult.data?.case?.title || '未知'}`);
        console.log(`   👥 嫌疑人数量: ${gameSession.suspects.length}`);
        console.log(`   🔍 初始线索数量: ${gameSession.clues.length}`);
        
        return { success: true, responseTime, data: toolResult.data };
      }
    }
    
    console.log('   ⚠️  工具调用结果异常');
    return { success: false, error: '工具调用结果异常' };
    
  } catch (error) {
    console.log('   ❌ 游戏开始失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function step2_ChatWithSuspect() {
  console.log('\n📋 步骤2: 与嫌疑人对话...');
  
  if (gameSession.suspects.length === 0) {
    console.log('   ❌ 没有可用的嫌疑人');
    return { success: false, error: '没有可用的嫌疑人' };
  }
  
  try {
    const suspect = gameSession.suspects[0]; // 选择第一个嫌疑人
    const startTime = Date.now();
    
    const result = await client.agent.run({
      agentId: 'suspectDialogueAgent',
      messages: [
        {
          role: 'user',
          content: `请模拟嫌疑人对话。

嫌疑人信息：
- 姓名：${suspect.name || '未知'}
- 性格：${suspect.personality || '普通'}
- 背景：${suspect.background || '无特殊背景'}
- 不在场证明：${suspect.alibi || '无'}
- 当前可疑程度：${suspect.suspicionLevel || 5}/10
- 是否真凶：${suspect.isCulprit ? '是' : '否'}

侦探问题："你当时在哪里？能详细说说你在案发时间的行踪吗？"

游戏上下文：
- 会话ID：${gameSession.sessionId}
- 剩余时间：300秒
- 已发现线索：${gameSession.clues.length}个

请使用 dialogue-management 工具生成自然、符合角色性格的对话回应。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 对话生成成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用: ${result.toolCalls?.length || 0} 次`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      if (toolResult && toolResult.success) {
        const conversation = {
          suspectId: suspect.id,
          question: "你当时在哪里？能详细说说你在案发时间的行踪吗？",
          response: toolResult.response,
          emotion: toolResult.emotion,
          suspicionLevel: toolResult.suspicionLevel,
          timestamp: new Date().toISOString()
        };
        
        gameSession.conversations.push(conversation);
        
        console.log(`   💬 嫌疑人回应: ${toolResult.response?.substring(0, 100)}...`);
        console.log(`   😊 情绪状态: ${toolResult.emotion || '未知'}`);
        console.log(`   🔍 可疑程度: ${toolResult.suspicionLevel || 'N/A'}/10`);
        
        return { success: true, responseTime, data: toolResult };
      }
    }
    
    console.log('   ⚠️  工具调用结果异常');
    return { success: false, error: '工具调用结果异常' };
    
  } catch (error) {
    console.log('   ❌ 对话生成失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function step3_AnalyzeInvestigation() {
  console.log('\n📋 步骤3: 调查分析...');
  
  try {
    const startTime = Date.now();
    
    const result = await client.agent.run({
      agentId: 'investigationAgent',
      messages: [
        {
          role: 'user',
          content: `请分析当前的调查进度。

案件信息：
- 案件：${gameSession.gameData?.case?.title || '办公室谋杀案'}
- 地点：${gameSession.gameData?.case?.location || '办公室'}
- 受害者：${gameSession.gameData?.case?.victim || '未知'}
- 案发时间：${gameSession.gameData?.case?.timeOfCrime || '未知'}

已发现线索：
${gameSession.clues.map((clue, index) => 
  `${index + 1}. ${clue.description} (重要性: ${clue.importance}/10)`
).join('\n')}

对话历史：
${gameSession.conversations.map((conv, index) => 
  `${index + 1}. 问：${conv.question}\n   答：${conv.response?.substring(0, 100)}...`
).join('\n')}

嫌疑人信息：
${gameSession.suspects.map((suspect, index) => 
  `${index + 1}. ${suspect.name} - 可疑程度: ${suspect.suspicionLevel}/10`
).join('\n')}

请使用 clue-analysis 工具进行深度分析，提供调查建议和推理方向。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 调查分析成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用: ${result.toolCalls?.length || 0} 次`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      if (toolResult && toolResult.success) {
        console.log(`   📊 分析结果: ${toolResult.analysis?.substring(0, 100)}...`);
        console.log(`   💡 建议数量: ${toolResult.suggestions?.length || 0}`);
        console.log(`   🎯 推理方向: ${toolResult.deductionDirection || '未提供'}`);
        
        return { success: true, responseTime, data: toolResult };
      }
    }
    
    console.log('   ⚠️  工具调用结果异常');
    return { success: false, error: '工具调用结果异常' };
    
  } catch (error) {
    console.log('   ❌ 调查分析失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function step4_SubmitDeduction() {
  console.log('\n📋 步骤4: 提交推理结果...');
  
  if (gameSession.suspects.length === 0) {
    console.log('   ❌ 没有可用的嫌疑人进行推理');
    return { success: false, error: '没有可用的嫌疑人' };
  }
  
  try {
    // 选择第一个嫌疑人作为推理结果
    const selectedSuspect = gameSession.suspects[0];
    const startTime = Date.now();
    
    const result = await client.agent.run({
      agentId: 'evaluationAgent',
      messages: [
        {
          role: 'user',
          content: `请评估推理结果。

推理信息：
- 选择的真凶：${selectedSuspect.name}
- 推理过程：基于对话分析和线索综合判断，${selectedSuspect.name}的回答存在疑点，且与现场线索有关联
- 支持证据：对话内容分析、现场线索关联
- 信心程度：75%

案件信息：
- 真实真凶：${gameSession.gameData?.case?.culpritId || selectedSuspect.id}
- 案件标题：${gameSession.gameData?.case?.title || '办公室谋杀案'}
- 案件难度：normal

游戏历史：
- 发现线索数：${gameSession.clues.length}
- 对话轮数：${gameSession.conversations.length}
- 用时：180秒
- 总时间：300秒
- 会话ID：${gameSession.sessionId}

嫌疑人列表：
${gameSession.suspects.map(s => `- ${s.name} (ID: ${s.id})`).join('\n')}

请使用 scoring 工具进行详细评估和打分。`
        }
      ]
    });

    const responseTime = Date.now() - startTime;
    
    console.log('   ✅ 推理评估成功！');
    console.log(`   ⏱️  响应时间: ${responseTime}ms`);
    console.log(`   📝 响应长度: ${result.text?.length || 0} 字符`);
    console.log(`   🔧 工具调用: ${result.toolCalls?.length || 0} 次`);
    
    if (result.toolCalls && result.toolCalls.length > 0) {
      const toolResult = result.toolCalls[0].result;
      if (toolResult && toolResult.success) {
        console.log(`   🎯 推理正确: ${toolResult.isCorrect ? '是' : '否'}`);
        console.log(`   📊 总分: ${toolResult.totalScore || 'N/A'}/100`);
        console.log(`   🏆 等级: ${toolResult.grade || '未知'}`);
        console.log(`   💬 反馈: ${toolResult.feedback?.substring(0, 100)}...`);
        
        return { success: true, responseTime, data: toolResult };
      }
    }
    
    console.log('   ⚠️  工具调用结果异常');
    return { success: false, error: '工具调用结果异常' };
    
  } catch (error) {
    console.log('   ❌ 推理评估失败');
    console.log(`   📝 错误: ${error.message}`);
    return { success: false, error: error.message };
  }
}

async function runCompleteGameFlow() {
  console.log('🎯 开始完整游戏流程测试...\n');
  console.log(`🆔 会话ID: ${gameSession.sessionId}`);
  
  const results = {
    step1: null,
    step2: null,
    step3: null,
    step4: null
  };

  const totalStartTime = Date.now();

  // 执行完整流程
  results.step1 = await step1_StartGame();
  if (results.step1.success) {
    results.step2 = await step2_ChatWithSuspect();
    if (results.step2.success) {
      results.step3 = await step3_AnalyzeInvestigation();
      if (results.step3.success) {
        results.step4 = await step4_SubmitDeduction();
      }
    }
  }

  const totalTime = Date.now() - totalStartTime;

  // 生成测试报告
  console.log('\n' + '='.repeat(60));
  console.log('📊 完整游戏流程测试报告');
  console.log('='.repeat(60));

  const successCount = Object.values(results).filter(r => r?.success).length;
  const totalSteps = Object.keys(results).length;

  console.log(`\n🎯 流程完成度: ${successCount}/${totalSteps} (${Math.round(successCount/totalSteps*100)}%)`);
  console.log(`⏱️  总耗时: ${totalTime}ms`);

  console.log('\n📋 详细结果:');
  console.log(`🎮 步骤1 - 游戏开始: ${results.step1?.success ? '✅ 成功' : '❌ 失败'} (${results.step1?.responseTime || 'N/A'}ms)`);
  console.log(`💬 步骤2 - 嫌疑人对话: ${results.step2?.success ? '✅ 成功' : '❌ 失败'} (${results.step2?.responseTime || 'N/A'}ms)`);
  console.log(`🔍 步骤3 - 调查分析: ${results.step3?.success ? '✅ 成功' : '❌ 失败'} (${results.step3?.responseTime || 'N/A'}ms)`);
  console.log(`📊 步骤4 - 推理评估: ${results.step4?.success ? '✅ 成功' : '❌ 失败'} (${results.step4?.responseTime || 'N/A'}ms)`);

  if (successCount === totalSteps) {
    console.log('\n🎉 完整游戏流程测试成功！');
    console.log('✅ 所有Agent功能正常工作');
    console.log('🚀 系统已准备好用于生产环境');
  } else {
    console.log('\n⚠️  部分流程需要调试');
    console.log('🔧 建议检查失败的步骤');
  }

  console.log('\n🎮 游戏数据总结:');
  console.log(`- 案件: ${gameSession.gameData?.case?.title || '未生成'}`);
  console.log(`- 嫌疑人: ${gameSession.suspects.length}个`);
  console.log(`- 线索: ${gameSession.clues.length}个`);
  console.log(`- 对话: ${gameSession.conversations.length}轮`);

  console.log('\n' + '='.repeat(60));
  return results;
}

// 运行完整测试
runCompleteGameFlow().catch(error => {
  console.error('❌ 完整流程测试失败:', error);
  process.exit(1);
});
